package com.ruoyi.recipes.mapper;

import java.util.List;
import com.ruoyi.recipes.domain.Recipes;
import com.ruoyi.recipes.domain.Comments;
import com.ruoyi.recipes.domain.RecipeFavorites;
import com.ruoyi.recipes.domain.Users;
import org.apache.ibatis.annotations.Param;

/**
 * 菜谱主表Mapper接口
 * 
 * @author syy
 * @date 2025-08-13
 */
public interface RecipesMapper 
{
    /**
     * 查询菜谱主表
     * 
     * @param id 菜谱主表主键
     * @return 菜谱主表
     */
    public Recipes selectRecipesById(Long id);

    /**
     * 查询菜谱主表列表
     * 
     * @param recipes 菜谱主表
     * @return 菜谱主表集合
     */
    public List<Recipes> selectRecipesList(Recipes recipes);

    /**
     * 新增菜谱主表
     * 
     * @param recipes 菜谱主表
     * @return 结果
     */
    public int insertRecipes(Recipes recipes);

    /**
     * 修改菜谱主表
     * 
     * @param recipes 菜谱主表
     * @return 结果
     */
    public int updateRecipes(Recipes recipes);

    /**
     * 删除菜谱主表
     * 
     * @param id 菜谱主表主键
     * @return 结果
     */
    public int deleteRecipesById(Long id);

    /**
     * 批量删除菜谱主表
     * 
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteRecipesByIds(Long[] ids);
    
    /**
     * 根据菜谱ID查询评论列表
     * 
     * @param recipeId 菜谱ID
     * @return 评论列表
     */
    public List<Comments> selectCommentsByRecipeId(Long recipeId);
    public Long getRecipeCommentCount(Long recipeId);
    /**
     * 根据菜谱ID查询评论数量
     * 
     * @param recipeId 菜谱ID
     * @return 评论数量
     */
    public Long selectCommentCountByRecipeId(Long recipeId);
    public List<Comments> getRecipeComments(Long recipeId);
    /**
     * 根据评论ID查询评论详情（包含用户信息）
     * 
     * @param commentId 评论ID
     * @return 评论详情
     */
    public Comments selectCommentWithUserById(Long commentId);
    
    /**
     * 插入评论
     * 
     * @param comments 评论信息
     * @return 结果
     */
    public int insertComment(Comments comments);
    
    /**
     * 更新评论点赞数
     * 
     * @param commentId 评论ID
     * @param likeCount 点赞数
     * @return 结果
     */
    public int updateCommentLikeCount(@Param("commentId") Long commentId, @Param("likeCount") Long likeCount);
    
    /**
     * 插入评论点赞记录
     * 
     * @param commentId 评论ID
     * @param userId 用户ID
     * @return 结果
     */
    public int insertCommentLike(@Param("commentId") Long commentId, @Param("userId") Long userId);
    
    /**
     * 删除评论点赞记录
     * 
     * @param commentId 评论ID
     * @param userId 用户ID
     * @return 结果
     */
    public int deleteCommentLike(@Param("commentId") Long commentId, @Param("userId") Long userId);
    
    /**
     * 检查用户是否已点赞评论
     * 
     * @param commentId 评论ID
     * @param userId 用户ID
     * @return 点赞记录数量
     */
    public int checkCommentLike(@Param("commentId") Long commentId, @Param("userId") Long userId);
    
    // ========== 收藏相关方法 ==========
    
    /**
     * 添加收藏
     * 
     * @param recipeFavorites 收藏信息
     * @return 结果
     */
    public int insertFavorite(RecipeFavorites recipeFavorites);
    
    /**
     * 取消收藏
     * 
     * @param recipeId 菜谱ID
     * @param userId 用户ID
     * @return 结果
     */
    public int deleteFavorite(@Param("recipeId") Long recipeId, @Param("userId") Long userId);
    
    /**
     * 根据菜谱ID查询收藏数量
     * 
     * @param recipeId 菜谱ID
     * @return 收藏数量
     */
    public Long selectFavoriteCountByRecipeId(Long recipeId);
    
    /**
     * 根据用户ID查询收藏列表
     * 
     * @param userId 用户ID
     * @return 收藏列表
     */
    public List<RecipeFavorites> selectFavoritesByUserId(Long userId);
    
    /**
     * 检查用户是否已收藏菜谱
     * 
     * @param recipeId 菜谱ID
     * @param userId 用户ID
     * @return 收藏记录数量
     */
    public int checkUserFavorite(@Param("recipeId") Long recipeId, @Param("userId") Long userId);
    
    /**
     * 更新菜谱收藏数量
     * 
     * @param recipeId 菜谱ID
     * @param collectCount 收藏数量
     * @return 结果
     */
    public int updateRecipeCollectCount(@Param("recipeId") Long recipeId, @Param("collectCount") Long collectCount);
    
    /**
     * 根据用户ID查询用户信息
     * 
     * @param userId 用户ID
     * @return 用户信息
     */
    public Users selectUserById(@Param("userId") Long userId);

    // ========== 推荐和标签相关方法 ==========




    /**
     * 根据场景标签获取菜谱列表
     *
     * @param recipes 查询条件（包含sceneTagId）
     * @return 菜谱列表
     */
    public List<Recipes> selectRecipesBySceneTag(Recipes recipes);
}
